package com.twb.fileCenter.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.twb.fileCenter.config.FileCenterProperties;
import com.twb.fileCenter.constants.FileCenterConstants;
import com.twb.fileCenter.ftp.FtpUtil;
import com.twb.fileCenter.sftp.SftpUtil;


/**
 * @Title FileUtil.java
 * @Description 文件工具类
 * 
 * @author DSY
 * @date 2014年8月14日 下午12:21:37
 */
@SuppressWarnings("all")
@Component
public class FileUtil {
	private static Logger logger = LoggerFactory.getLogger(FileUtil.class);

	private static String serverPath = "";// 文件服务器目录地址
	private static String serverType= FileCenterConstants.serverType.LOCAL;//是否使用ftp 文件服务器
	@Autowired
	FileCenterProperties twbFileCenterProperties;
	private static FileCenterProperties fileCenterProperties;
	@PostConstruct
	public void init() {
		fileCenterProperties = twbFileCenterProperties;
		serverPath = fileCenterProperties.getFileServerPath();
		serverType = fileCenterProperties.getServerType();
	}
	/**
	 * @Title deleteFile
	 * @Class FileUtil.java
	 * @Description 删除文件
	 * 
	 * @param filePath
	 *            新上传文件路径
	 * 
	 * @author DSY
	 * @date 2014年7月18日 下午1:42:23
	 */
	// public static void deleteFile(HttpServletRequest request, String
	// filePath) {
	// getServerPath(request);
	// String path = serverPath + filePath;
	// if (!isRunning) {
	// logger.debug("删除/Tomcat/目录下过期图片执行开始...");
	// isRunning = true;
	// File file = new File(path);
	// // 判断文件是否存在
	// boolean falg = false;
	// falg = file.exists();
	// if (falg) {
	// logger.debug("文件存在");
	// if (true == file.isFile()) {
	// boolean flag = false;
	// flag = file.delete();
	// if (flag) {
	// logger.debug("成功删除无效图片文件:" + file.getName());
	// }
	// }
	// } else {
	// logger.debug("未找到tomcat/temp文件夹，执行失败，请手动删除temp下所有png文件");
	// }
	// isRunning = false;
	// logger.debug("删除/Tomcat/目录下过期图片执行结束...");
	// }
	// }

	/**
	 * @Title readFileUTF8
	 * @Class FileUtil.java
	 * @Description 读取文件内容（使用UTF-8编码）
	 * 
	 * @param filePath
	 *            输出文件路径
	 * @param isFormat
	 *            是否输出格式
	 * @return
	 * @throws Exception
	 * 
	 * @author DSY
	 * @date 2014年8月14日 上午11:47:35
	 */
	public static String readFileUTF8(String filePath, boolean isFormat) throws Exception {
		File file = new File(filePath);
		FileInputStream fis = new FileInputStream(file);
		BufferedReader br = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
		String fileContent = "";
		String temp = "";
		while ((temp = br.readLine()) != null) {
			if (isFormat) {
				temp += "\n";
			}
			fileContent = fileContent + temp;
		}
		br.close();
		fis.close();
		return fileContent;
	}

	/**
	 * @Title createDir
	 * @Class FileUtil.java
	 * @Description 如果欲写入的文件所在目录不存在，需先创建
	 * 
	 * @param outputPath
	 *            输出文件路径
	 * 
	 * @author DSY
	 * @date 2014年8月14日 上午11:49:19
	 */
	public static void createDir(String outputPath) {
		if(serverType.equals(FileCenterConstants.serverType.FTP)){
			try {
				FtpUtil.createAndChangeDirectory(outputPath.substring(0,outputPath.lastIndexOf("/")+1));
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else if(serverType.equals(FileCenterConstants.serverType.SFTP)){
			try {
				SftpUtil.createAndChangeDirectory(outputPath.substring(0,outputPath.lastIndexOf("/")+1));
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{
			File outputFile = new File(outputPath);
			File outputDir = outputFile.getParentFile();
			if (!outputDir.exists()) {
				outputDir.mkdirs();
			}
		}
	}

	/**
	 * @Title writeFileUTF8
	 * @Class FileUtil.java
	 * @Description 将文件内容写入文件（使用UTF-8编码）
	 * 
	 * @param content
	 *            文件内容
	 * @param filePath
	 *            输出文件路径
	 * @throws Exception
	 * 
	 * @author DSY
	 * @date 2014年8月14日 上午11:49:36
	 */
	public static void writeFileUTF8(String content, String filePath) throws Exception {
		createDir(filePath);
		File file = new File(filePath);
		FileOutputStream fos = new FileOutputStream(file);
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8"));
		bw.write(content);
		bw.flush();
		bw.close();
		fos.close();
	}

	/**
	 * @Title writeFile
	 * @Class FileUtil.java
	 * @Description 写文件
	 * 
	 * @param is
	 *            输入流
	 * @param outputPath
	 *            输出文件路径
	 * @param isApend
	 *            是否追加
	 * @throws IOException
	 * 
	 * @author DSY
	 * @date 2014年8月14日 上午11:50:52
	 */
	public static void writeFile(InputStream is, String outputPath, boolean isApend) throws IOException {
		FileInputStream fis = (FileInputStream) is;
		createDir(outputPath);
		FileOutputStream fos = new FileOutputStream(outputPath, isApend);
		byte[] bs = new byte[1024 * 16];
		int len = -1;
		while ((len = fis.read(bs)) != -1) {
			fos.write(bs, 0, len);
		}
		fos.close();
		fis.close();
	}

	/**
	 * @Title writeFile
	 * @Class FileUtil.java
	 * @Description copy文件
	 * 
	 * @param is
	 *            输入流
	 * @param outputPath
	 *            输出文件路径
	 * @throws Exception
	 * 
	 * @author DSY
	 * @date 2014年8月14日 上午11:52:19
	 */
	public static void writeFile(InputStream is, String outputPath) throws Exception {
		InputStream bis = null;
		OutputStream bos = null;
		createDir(outputPath);
		bis = new BufferedInputStream(is);
		bos = new BufferedOutputStream(new FileOutputStream(outputPath));
		byte[] bs = new byte[1024 * 10];
		int len = -1;
		while ((len = bis.read(bs)) != -1) {
			bos.write(bs, 0, len);
		}
		bos.flush();
		bis.close();
		bos.close();
	}

	/**
	 * @Title writeFile
	 * @Class FileUtil.java
	 * @Description 写文件
	 * 
	 * @param inPath
	 *            输入文件路径
	 * @param outputPath
	 *            输出文件路径
	 * @param isApend
	 *            是否追加
	 * @throws IOException
	 * 
	 * @author DSY
	 * @date 2014年8月14日 上午11:54:01
	 */
	public static void writeFile(String inPath, String outputPath, boolean isApend) throws IOException {
		if (new File(inPath).exists()) {
			FileInputStream fis = new FileInputStream(inPath);
			writeFile(fis, outputPath, isApend);
		} else {
			logger.info("文件copy失败，由于源文件不存在!");
		}
	}

	/**
	 * @Title writeContent
	 * @Class FileUtil.java
	 * @Description 将字符串写到文件内
	 * 
	 * @param msg
	 *            字符串
	 * @param outputPath
	 *            输出文件路径
	 * @param isApend
	 *            是否追加
	 * @throws IOException
	 * 
	 * @author DSY
	 * @date 2014年8月14日 下午12:19:53
	 */
	public static void writeContent(String msg, String outputPath, boolean isApend) throws IOException {
		BufferedWriter bw = new BufferedWriter(new FileWriter(outputPath, isApend));
		bw.write(msg);
		bw.flush();
		bw.close();
	}

	/**
	 * @Title delFileOrDerectory
	 * @Class FileUtil.java
	 * @Description 删除文件夹下的所有内容,包括本文件夹
	 * 
	 * @param path
	 *            删除文件路径
	 * @throws IOException
	 * 
	 * @author DSY
	 * @date 2014年8月14日 下午12:20:55
	 */
	public static void delFileOrDerectory(String path) throws IOException {
		File file = new File(path);
		if (file.exists()) {
			if (file.isDirectory()) {
				File[] files = file.listFiles();
				for (int i = 0; i < files.length; i++) {
					File subFile = files[i];
					delFileOrDerectory(subFile.getAbsolutePath());
				}
				file.delete();
			} else {
				file.delete();
			}
		}
	}

	/**
	 * @Title delFile
	 * @Class FileUtil.java
	 * @Description 删除文件
	 * 
	 * @param filePathAndName
	 *            文本文件完整绝对路径及文件名
	 * @return 成功删除返回true遭遇异常返回false
	 * 
	 * @author DSY
	 * @date 2014年8月14日 下午1:42:02
	 */
	public static boolean delFile(String filePathAndName) {
		boolean bea = false;
		if(serverType.equals(FileCenterConstants.serverType.FTP)){
			String serverpath = filePathAndName.substring(0,filePathAndName.lastIndexOf("/")+1);
			String fileName = filePathAndName.substring(filePathAndName.lastIndexOf("/")+1);
			FtpUtil.deleteFile(serverpath, fileName);
		}else if(serverType.equals(FileCenterConstants.serverType.SFTP)){
			String serverpath = filePathAndName.substring(0,filePathAndName.lastIndexOf("/")+1);
			String fileName = filePathAndName.substring(filePathAndName.lastIndexOf("/")+1);
			SftpUtil.deleteFile(serverpath, fileName);
		}else{
			String filePath = filePathAndName;
			File myDelFile = new File(filePath);
			if (myDelFile.exists()) {
				myDelFile.delete();
				bea = true;
			} else {
				bea = false;
				logger.info(filePathAndName + "删除文件操作出错");
			}
		}
		return bea;
	}

	/**
	 * @Title copyFile
	 * @Class FileUtil.java
	 * @Description 复制单个文件
	 * 
	 * @param oldPathFile
	 *            准备复制的文件源
	 * @param newPathFile
	 *            拷贝到新绝对路径带文件名
	 * @throws Exception
	 * 
	 * @author DSY
	 * @date 2014年8月14日 下午1:34:24
	 */
	public static void copyFile(String oldPathFile, String newPathFile) throws Exception {
		if(serverType.equals(FileCenterConstants.serverType.FTP)){
			FtpUtil.copyFile(oldPathFile, newPathFile,false);
		}else if(serverType.equals(FileCenterConstants.serverType.SFTP)){
			SftpUtil.copyFile(oldPathFile, newPathFile);
		}else{
			int bytesum = 0;
			int byteread = 0;
			File oldfile = new File(oldPathFile);
			if (oldfile.exists()) { // 文件存在
				InputStream inStream = new FileInputStream(oldPathFile); // 读入源文件
				FileOutputStream fs = new FileOutputStream(newPathFile);
				byte[] buffer = new byte[1444];
				while ((byteread = inStream.read(buffer)) != -1) {
					bytesum += byteread; // 字节 文件大小
					logger.info("字节 文件大小:" + bytesum);
					fs.write(buffer, 0, byteread);
				}
				inStream.close();
				fs.flush();
				fs.close();
			}
		}
	}

	/**
	 * @Title copyFolder
	 * @Class FileUtil.java
	 * @Description 复制整个文件夹的内容
	 * 
	 * @param oldPath
	 *            准备拷贝的目录
	 * @param newPath
	 *            指定绝对路径的新目录
	 * @throws Exception
	 * 
	 * @author DSY
	 * @date 2014年8月14日 下午1:38:34
	 */
	public void copyFolder(String oldPath, String newPath) throws Exception {
		if(serverType.equals(FileCenterConstants.serverType.FTP)){
			FtpUtil.copyFile(oldPath, newPath,false);
		}else if(serverType.equals(FileCenterConstants.serverType.SFTP)){
			SftpUtil.copyFile(oldPath, newPath);
		}else{
			new File(newPath).mkdirs(); // 如果文件夹不存在 则建立新文件
			File a = new File(oldPath);
			String[] file = a.list();
			File temp = null;
			for (int i = 0; i < file.length; i++) {
				if (oldPath.endsWith(File.separator)) {
					temp = new File(oldPath + file[i]);
				} else {
					temp = new File(oldPath + File.separator + file[i]);
				}
				if (temp.isFile()) {
					FileInputStream input = new FileInputStream(temp);
					FileOutputStream output = new FileOutputStream(newPath + "/" + (temp.getName()).toString());
					byte[] b = new byte[1024 * 5];
					int len;
					while ((len = input.read(b)) != -1) {
						output.write(b, 0, len);
					}
					output.flush();
					output.close();
					input.close();
				}
				if (temp.isDirectory()) {// 如果是子文件
					copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]);
				}
			}
		}
	}

	/**
	 * @Title moveFile
	 * @Class FileUtil.java
	 * @Description 移动文件
	 * 
	 * @param oldPath
	 * @param newPath
	 * @throws Exception
	 * 
	 * @author DSY
	 * @date 2014年8月14日 下午1:43:15
	 */
	public static void moveFile(String oldPath, String newPath) throws Exception {
		copyFile(oldPath, newPath);
		delFile(oldPath);
	}

	/**
	 * @Title moveFolder
	 * @Class FileUtil.java
	 * @Description 移动目录
	 * 
	 * @param oldPath
	 * @param newPath
	 * @throws Exception
	 * 
	 * @author DSY
	 * @date 2014年8月14日 下午1:44:07
	 */
	public void moveFolder(String oldPath, String newPath) throws Exception {
		copyFolder(oldPath, newPath);
		delFileOrDerectory(oldPath);
	}

	/**
	 * @Title readFile
	 * @Class FileUtil.java
	 * @Description 读取文件夹下所有文件
	 * 
	 * @param path
	 *            文件夹
	 * @param list
	 *            读取文件集合
	 * 
	 * @author DSY
	 * @date 2014年9月29日 下午3:30:11
	 */
	public static void readFile(String path, java.util.List<String> list) {
		File file = new File(path);
		if (file.isDirectory()) {
			logger.info("读取文件!");
			String[] fileList = file.list();
			for (String string : fileList) {
				File readFile = new File(path + "/" + string);
				if (readFile.isDirectory()) {
					readFile(path + "/" + string, list);
				} else {
					list.add(path + "/" + string);
				}
			}
		}
	}

	/**
	 * @Title recyclingWaste
	 * @Class FileUtil.java
	 * @Description 系统垃圾文件回收
	 * 
	 * @param path
	 *            待回收的文件路径
	 * @throws Exception
	 * 
	 * @author DSY
	 * @date 2015年12月17日 上午10:57:53
	 */
	public static void recyclingWaste(HttpServletRequest request, String path) throws Exception {
		String wastePath = serverPath + fileCenterProperties.getUploadPath() + "/recyclingWaste";

		if (path == null || "".equals(path)) {
			return;
		}
		wastePath += path.replace(fileCenterProperties.getUploadPath(), "");
		createDir(wastePath);

		moveFile(serverPath + path, wastePath);
	}

	/**
	 * @Title delServerFile
	 * @Description 删除服务器文件
	 * @param filePathAndName
	 * @return
	 * @author DSY
	 * @date 2020年1月12日 下午10:26:17
	 */
	public static boolean delServerFile(String filePathAndName) {
		String path = serverPath+filePathAndName;
		return delFile(path);
	}
	public static void main(String[] args) throws Exception {
		// String readFileUTF8 = readFileUTF8("E:/public_key", true);
		System.out.println(FileUtil.class.getResource("").getPath());
	}
}
